{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2.0.0-alpha0\n",
      "sys.version_info(major=3, minor=7, micro=3, releaselevel='final', serial=0)\n",
      "matplotlib 3.0.3\n",
      "numpy 1.16.2\n",
      "pandas 0.24.2\n",
      "sklearn 0.20.3\n",
      "tensorflow 2.0.0-alpha0\n",
      "tensorflow.python.keras.api._v2.keras 2.2.4-tf\n"
     ]
    }
   ],
   "source": [
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "import numpy as np\n",
    "import sklearn\n",
    "import pandas as pd\n",
    "import os\n",
    "import sys\n",
    "import time\n",
    "import tensorflow as tf\n",
    "\n",
    "from tensorflow import keras\n",
    "\n",
    "print(tf.__version__)\n",
    "print(sys.version_info)\n",
    "for module in mpl, np, pd, sklearn, tf, keras:\n",
    "    print(module.__name__, module.__version__)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(5000, 28, 28) (5000,)\n",
      "(55000, 28, 28) (55000,)\n",
      "(10000, 28, 28) (10000,)\n"
     ]
    }
   ],
   "source": [
    "fashion_mnist = keras.datasets.fashion_mnist\n",
    "(x_train_all, y_train_all), (x_test, y_test) = fashion_mnist.load_data()\n",
    "x_valid, x_train = x_train_all[:5000], x_train_all[5000:]\n",
    "y_valid, y_train = y_train_all[:5000], y_train_all[5000:]\n",
    "\n",
    "print(x_valid.shape, y_valid.shape)\n",
    "print(x_train.shape, y_train.shape)\n",
    "print(x_test.shape, y_test.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# x = (x - u) / std\n",
    "\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "scaler = StandardScaler()\n",
    "# x_train: [None, 28, 28] -> [None, 784]\n",
    "x_train_scaled = scaler.fit_transform(\n",
    "    x_train.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28)\n",
    "x_valid_scaled = scaler.transform(\n",
    "    x_valid.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28)\n",
    "x_test_scaled = scaler.transform(\n",
    "    x_test.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# tf.keras.models.Sequential()\n",
    "\n",
    "model = keras.models.Sequential()\n",
    "model.add(keras.layers.Flatten(input_shape=[28, 28]))\n",
    "for _ in range(20):\n",
    "    model.add(keras.layers.Dense(100, activation=\"relu\"))\n",
    "model.add(keras.layers.Dense(10, activation=\"softmax\"))\n",
    "\n",
    "model.compile(loss=\"sparse_categorical_crossentropy\",\n",
    "              optimizer = \"sgd\",\n",
    "              metrics = [\"accuracy\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "flatten (Flatten)            (None, 784)               0         \n",
      "_________________________________________________________________\n",
      "dense (Dense)                (None, 100)               78500     \n",
      "_________________________________________________________________\n",
      "dense_1 (Dense)              (None, 100)               10100     \n",
      "_________________________________________________________________\n",
      "dense_2 (Dense)              (None, 100)               10100     \n",
      "_________________________________________________________________\n",
      "dense_3 (Dense)              (None, 100)               10100     \n",
      "_________________________________________________________________\n",
      "dense_4 (Dense)              (None, 100)               10100     \n",
      "_________________________________________________________________\n",
      "dense_5 (Dense)              (None, 100)               10100     \n",
      "_________________________________________________________________\n",
      "dense_6 (Dense)              (None, 100)               10100     \n",
      "_________________________________________________________________\n",
      "dense_7 (Dense)              (None, 100)               10100     \n",
      "_________________________________________________________________\n",
      "dense_8 (Dense)              (None, 100)               10100     \n",
      "_________________________________________________________________\n",
      "dense_9 (Dense)              (None, 100)               10100     \n",
      "_________________________________________________________________\n",
      "dense_10 (Dense)             (None, 100)               10100     \n",
      "_________________________________________________________________\n",
      "dense_11 (Dense)             (None, 100)               10100     \n",
      "_________________________________________________________________\n",
      "dense_12 (Dense)             (None, 100)               10100     \n",
      "_________________________________________________________________\n",
      "dense_13 (Dense)             (None, 100)               10100     \n",
      "_________________________________________________________________\n",
      "dense_14 (Dense)             (None, 100)               10100     \n",
      "_________________________________________________________________\n",
      "dense_15 (Dense)             (None, 100)               10100     \n",
      "_________________________________________________________________\n",
      "dense_16 (Dense)             (None, 100)               10100     \n",
      "_________________________________________________________________\n",
      "dense_17 (Dense)             (None, 100)               10100     \n",
      "_________________________________________________________________\n",
      "dense_18 (Dense)             (None, 100)               10100     \n",
      "_________________________________________________________________\n",
      "dense_19 (Dense)             (None, 100)               10100     \n",
      "_________________________________________________________________\n",
      "dense_20 (Dense)             (None, 10)                1010      \n",
      "=================================================================\n",
      "Total params: 271,410\n",
      "Trainable params: 271,410\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 55000 samples, validate on 5000 samples\n",
      "Epoch 1/10\n",
      "55000/55000 [==============================] - 10s 176us/sample - loss: 2.3015 - accuracy: 0.1545 - val_loss: 2.3003 - val_accuracy: 0.1836\n",
      "Epoch 2/10\n",
      "55000/55000 [==============================] - 9s 168us/sample - loss: 2.2986 - accuracy: 0.2150 - val_loss: 2.2962 - val_accuracy: 0.2810\n",
      "Epoch 3/10\n",
      "55000/55000 [==============================] - 9s 166us/sample - loss: 2.2922 - accuracy: 0.2613 - val_loss: 2.2862 - val_accuracy: 0.2754\n",
      "Epoch 4/10\n",
      "55000/55000 [==============================] - 9s 171us/sample - loss: 2.2762 - accuracy: 0.2561 - val_loss: 2.2612 - val_accuracy: 0.2166\n",
      "Epoch 5/10\n",
      "55000/55000 [==============================] - 9s 172us/sample - loss: 2.2314 - accuracy: 0.2031 - val_loss: 2.1790 - val_accuracy: 0.2110\n",
      "Epoch 6/10\n",
      "55000/55000 [==============================] - 10s 179us/sample - loss: 2.0297 - accuracy: 0.1991 - val_loss: 1.8517 - val_accuracy: 0.2186\n",
      "Epoch 7/10\n",
      "55000/55000 [==============================] - 10s 178us/sample - loss: 1.6283 - accuracy: 0.3014 - val_loss: 1.2842 - val_accuracy: 0.4114\n",
      "Epoch 8/10\n",
      "55000/55000 [==============================] - 10s 177us/sample - loss: 1.1413 - accuracy: 0.5166 - val_loss: 1.1425 - val_accuracy: 0.5178\n",
      "Epoch 9/10\n",
      "55000/55000 [==============================] - 10s 175us/sample - loss: 0.9829 - accuracy: 0.5883 - val_loss: 0.9107 - val_accuracy: 0.6196\n",
      "Epoch 10/10\n",
      "55000/55000 [==============================] - 10s 173us/sample - loss: 0.8919 - accuracy: 0.6378 - val_loss: 0.8084 - val_accuracy: 0.7010\n"
     ]
    }
   ],
   "source": [
    "# Tensorboard, earlystopping, ModelCheckpoint\n",
    "logdir = './dnn-callbacks'\n",
    "if not os.path.exists(logdir):\n",
    "    os.mkdir(logdir)\n",
    "output_model_file = os.path.join(logdir,\n",
    "                                 \"fashion_mnist_model.h5\")\n",
    "\n",
    "callbacks = [\n",
    "    keras.callbacks.TensorBoard(logdir),\n",
    "    keras.callbacks.ModelCheckpoint(output_model_file,\n",
    "                                    save_best_only = True),\n",
    "    keras.callbacks.EarlyStopping(patience=5, min_delta=1e-3),\n",
    "]\n",
    "history = model.fit(x_train_scaled, y_train, epochs=10,\n",
    "                    validation_data=(x_valid_scaled, y_valid),\n",
    "                    callbacks = callbacks)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_learning_curves(history):\n",
    "    pd.DataFrame(history.history).plot(figsize=(8, 5))\n",
    "    plt.grid(True)\n",
    "    plt.gca().set_ylim(0, 3)\n",
    "    plt.show()\n",
    "\n",
    "plot_learning_curves(history)\n",
    "\n",
    "# 1. 参数众多，训练不充分\n",
    "# 2. 梯度消失 -> 链式法则 -> 复合函数f(g(x))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "10000/10000 [==============================] - 1s 116us/sample - loss: 0.8281 - accuracy: 0.6905\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[0.8280843431472779, 0.6905]"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.evaluate(x_test_scaled, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
